const express = require('express')
const cors = require('cors')  //处理跨域的中间件
const joi = require('@escook/express-joi')
const expressJWT = require('express-jwt')
const config = require('./config')

//导入路由模块
const useRouter = require('./router/user')
const userInfoRouter = require('./router/userinfo')
//创建express服务器实例
const app = express()
//将cors注册为全局的中间件
app.use(cors())
//配置解析表单数据的中间件(只能解析application/x-www-form-urlencoded 格式的表单数据)
app.use(express.urlencoded({extended: false}));
//为res对象挂载一个res.cc函数(中间件)
app.use(function(req, res, next){
    // status=0成功，status=1失败， 默认将status的值设置为1，方便处理失败的情况
    res.cc = function(err, status=1)
    {
        res.send({
            //状态
            status,
            //状态描述,判断err是错误对象还是字符串
            message: err instanceof Error ? err.message : err,

        })
    }
    next()
})
//使用.unless({})指定哪些接口不需要进行Token验证
app.use(expressJWT({ secret: config.jwtSecretKey}).unless({path:[/^\/api\//]}))
//注册路由模块
app.use('/api', useRouter)
app.use('/my', userInfoRouter)

// //定义错误级别中间件（捕捉数据验证失败所发生的全局性错误消息）
app.use(function (err, req, res, next) {
    //响应验证失败导致的错误(如果err是joi.ValidationError的实例)
    // if (err instanceof joi.ValidationError) return res.cc('表单数据验证失败')
   

    //捕获身份认证失败的错误
    if(err.name === 'UnauthorizedError') return res.cc('身份认证失败')


    //未知错误
    res.cc(err)

  })

app.listen(8000, function(){
    console.log('api server running at http://127.0.0.1:8000');
})


